import { defineStore, acceptHMRUpdate } from "pinia";
import { computed, reactive } from "vue";
import { ShortcutHandler, unregisterAll } from "@tauri-apps/api/globalShortcut";
import { Shortcut, type ShortcutState, type ShortcutItem } from "@/lib/keyboard";

const useShortcutStore = defineStore("shortcut", () => {
    // 快捷键管理表
    const shortcutItemMap = new Map<string, ShortcutItem>();

    /**
     * 注册快捷键
     * @param name 快捷键的唯一标识
     * @param fileName 快捷键的配置文件名，默认与 name 相同
     * @returns 返回 ShortcutItem
     */
    function register(name: string, fileName?: string): ShortcutItem {
        // 检查快捷键是否存在
        let item = shortcutItemMap.get(name);
        if (item !== undefined) {
            return item;
        }

        // 创建快捷键
        item = reactive(Shortcut.item());
        item.name = name;
        item.fileName = fileName ?? name;

        // 添加快捷键
        shortcutItemMap.set(name, item);

        // 返回快捷键
        return item;
    }

    /**
     * 绑定快捷键并启用，如果已启用则不重新启用
     * @param name 快捷键的唯一标识
     * @param handler 快捷键处理函数
     * @returns 是否启用
     */
    async function bind(name: string, handler?: ShortcutHandler): Promise<boolean> {
        // 检查快捷键是否存在
        const item = shortcutItemMap.get(name);
        if (item === undefined) {
            console.warn("快捷键不存在", name);
            return false;
        }

        // 如果已启用，则直接返回 true
        if (item.used) {
            return true;
        }

        // 加载快捷键
        if (!Shortcut.isAvailableState(item.shortcut)) {
            await Shortcut.load(item);
        }

        // 设置快捷键处理函数
        if (handler !== undefined) {
            item.handler = handler;
        }

        // 启动快捷键
        await Shortcut.enable(item);

        // 启用失败
        if (!item.used) {
            item.shortcut = Shortcut.state();
        }

        return item.used;
    }

    /**
     * 替换快捷键
     * @param name 快捷键的唯一标识
     * @param shortcut 新的快捷键
     * @param handler 快捷键处理函数
     * @returns 替换是否成功
     */
    async function replace(name: string, shortcut: ShortcutState, handler?: ShortcutHandler): Promise<boolean> {
        // 检查快捷键是否存在
        const item = shortcutItemMap.get(name);
        if (item === undefined) {
            console.warn("快捷键不存在", name);
            return false;
        }

        // 如果已启用，先停用
        if (item.used) {
            await Shortcut.disable(item);
        }

        // 替换快捷键
        item.shortcut = shortcut;

        // 设置快捷键处理函数
        if (handler !== undefined) {
            item.handler = handler;
        }

        // key 为空
        if (!Shortcut.isAvailableState(item.shortcut)) {
            await Shortcut.save(item);
            return true;
        }

        // 保存并启用快捷键
        await Promise.all([Shortcut.save(item), Shortcut.enable(item)]);

        // 启用失败
        if (!item.used) {
            item.shortcut = Shortcut.state();
        }

        return item.used;
    }

    /**
     * 清除所有快捷键
     */
    async function close() {
        await unregisterAll();
        shortcutItemMap.forEach((item) => {
            item.shortcut = Shortcut.state();
            item.used = false;
        });
    }

    return {
        all: computed(() => shortcutItemMap),
        register,
        bind,
        replace,
        close,
    };
});

if (import.meta.hot) {
    import.meta.hot.accept(acceptHMRUpdate(useShortcutStore, import.meta.hot));
}

export default useShortcutStore;
